/**
 * 路由导航守卫
 * @function
 * @param {VueRouter} router 路由实例
 */
// 获取取消正在执行的函数逻辑
import { cancelFn } from '@u/axios';
import { isExternal } from '@u/url';

// 白名单
import { whiteRouter } from './whiteRouter';

//进度条
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
NProgress.configure({
	easing: 'ease', // 动画方式
	speed: 500, // 递增进度条的速度
	showSpinner: true, // 是否显示加载ico
	trickleSpeed: 200, // 自动递增间隔
	minimum: 0.3 // 初始化时的最小百分比
});

/**
 * 获取版本号
 */
import versionTood from './versionUpdate';
import { TITLE } from '@/config';

export default function (router) {
	/**
	 * 全局前置守卫
	 */
	router.beforeEach(async (to, from, next) => {
		// 外链地址
		if (isExternal(to.path)) {
			window.open(to.path, '_block');
		} else {
			document.title = TITLE || to.meta.title;

			// 缓存页面
			if (to.meta?.keepAlive && !$store.guarder.cachedComponents.includes(to.name)) {
				$store.guarder.cachedComponents.push(to.name);
			}

			// 缓存页面--跳转非子页面清空缓存
			if (!(to.meta?.title?.includes(from.meta.title) && to.meta?.title?.includes('-')) && from.meta?.keepAlive) {
				const index = $store.guarder.cachedComponents.indexOf(from.name);
				if (index !== -1) $store.guarder.cachedComponents.splice(index, 1);
			}

			// 开启进度条
			NProgress.start();

			// 清除正在进行中的所有请求
			cancelFn();

			//判断当前代码版本是否与服务器中代码版本一致，如不一致则刷新页面获取最新
			versionTood();

			// 联合登陆功能添加token
			if (to.query.uid) {
				if (to.query.pputoken) $store.user.token = to.query.pputoken;
				$store.user.uid = to.query.uid;
				to.query = {};
			}
			// 512页面
			if (to.path === '/512') {
				next();
				return;
			}
			/** 已经登录了存在token */
			if ($store.user.token || $store.user.uid) {
				// 判断当前用户是否已拉取完user_info信息
				if (!$store.user.rolesGets.length) await $store.user.GetInfo();

				// 生成对应权限的路由
				if (!$store.guarder.Menus.length) {
					await $store.guarder.GenerateRoutes();

					// hack方法 确保addRoutes已完成
					next({ ...to, replace: false });
				} else {
					next();
				}
			} else {
				if (whiteRouter(to.path)) {
					// 在免登录白名单，直接进入
					next();
				} else {
					next({
						name: '/login',
						query: { redirect: to.fullPath }
					});
				}
			}
		}
	});

	/**
	 * 全局后置守卫
	 */
	router.afterEach(() => {
		NProgress.done();
		window.scroll(0, 0);
	});
}
